home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / include / tkCanvas.h < prev    next >
C/C++ Source or Header  |  1992-08-19  |  16KB  |  400 lines

  1. /*
  2.  * tkCanvas.h --
  3.  *
  4.  *    Declarations shared among all the files that implement
  5.  *    canvas widgets.
  6.  *
  7.  * Copyright 1991-1992 Regents of the University of California.
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  *
  16.  * $Header: /user6/ouster/wish/RCS/tkCanvas.h,v 1.14 92/08/19 08:34:16 ouster Exp $ SPRITE (Berkeley)
  17.  */
  18.  
  19. #ifndef _TKCANVAS
  20. #define _TKCANVAS
  21.  
  22. #ifndef _TK
  23. #include "tk.h"
  24. #endif
  25.  
  26. /*
  27.  * For each item in a canvas widget there exists one record with
  28.  * the following structure.  Each actual item is represented by
  29.  * a record with the following stuff at its beginning, plus additional
  30.  * type-specific stuff after that.
  31.  */
  32.  
  33. #define TK_TAG_SPACE 3
  34.  
  35. typedef struct Tk_Item  {
  36.     int id;                /* Unique identifier for this item
  37.                      * (also serves as first tag for
  38.                      * item). */
  39.     struct Tk_Item *nextPtr;        /* Next in display list of all
  40.                      * items in this canvas.  Later items
  41.                      * in list are drawn on top of earlier
  42.                      * ones. */
  43.     Tk_Uid staticTagSpace[TK_TAG_SPACE];/* Built-in space for limited # of
  44.                      * tags. */
  45.     Tk_Uid *tagPtr;            /* Pointer to array of tags.  Usually
  46.                      * points to staticTagSpace, but
  47.                      * may point to malloc-ed space if
  48.                      * there are lots of tags. */
  49.     int tagSpace;            /* Total amount of tag space available
  50.                      * at tagPtr. */
  51.     int numTags;            /* Number of tag slots actually used
  52.                      * at *tagPtr. */
  53.     struct Tk_ItemType *typePtr;    /* Table of procedures that implement
  54.                      * this type of item. */
  55.     int x1, y1, x2, y2;            /* Bounding box for item, in integer
  56.                      * canvas units. Set by item-specific
  57.                      * code and guaranteed to contain every
  58.                      * pixel drawn in item.  Item area
  59.                      * includes x1 and y1 but not x2
  60.                      * and y2. */
  61.  
  62.     /*
  63.      *------------------------------------------------------------------
  64.      * Starting here is additional type-specific stuff;  see the
  65.      * declarations for individual types to see what is part of
  66.      * each type.  The actual space below is determined by the
  67.      * "itemInfoSize" of the type's Tk_ItemType record.
  68.      *------------------------------------------------------------------
  69.      */
  70. } Tk_Item;
  71.  
  72. /*
  73.  * The record below describes a canvas widget.  It is made available
  74.  * to the item procedures so they can access certain shared fields such
  75.  * as the overall displacement and scale factor for the canvas.
  76.  */
  77.  
  78. typedef struct {
  79.     Tk_Window tkwin;        /* Window that embodies the canvas.  NULL
  80.                  * means that the window has been destroyed
  81.                  * but the data structures haven't yet been
  82.                  * cleaned up.*/
  83.     Tcl_Interp *interp;        /* Interpreter associated with canvas. */
  84.     Tk_Item *firstItemPtr;    /* First in list of all items in canvas,
  85.                  * or NULL if canvas empty. */
  86.     Tk_Item *lastItemPtr;    /* Last in list of all items in canvas,
  87.                  * or NULL if canvas empty. */
  88.  
  89.     /*
  90.      * Information used when displaying widget:
  91.      */
  92.  
  93.     int borderWidth;        /* Width of 3-D border around window. */
  94.     Tk_3DBorder bgBorder;    /* Used for canvas background. */
  95.     XColor *bgColor;        /* Color used for clearing to background. */
  96.     int relief;            /* Indicates whether window as a whole is
  97.                  * raised, sunken, or flat. */
  98.     GC pixmapGC;        /* Used to copy bits from a pixmap to the
  99.                  * screen and also to clear the pixmap. */
  100.     int width, height;        /* Dimensions to request for canvas window,
  101.                  * specified in pixels. */
  102.     int redrawX1, redrawY1;    /* Upper left corner of area to redraw,
  103.                  * in pixel coordinates.  Border pixels
  104.                  * are included.  Only valid if
  105.                  * REDRAW_PENDING flag is set. */
  106.     int redrawX2, redrawY2;    /* Lower right corner of area to redraw,
  107.                  * in pixel coordinates.  Border pixels
  108.                  * will *not* be redrawn. */
  109.     int confine;        /* Non-zero means constrain view to keep
  110.                  * as much of canvas visible as possible. */
  111.  
  112.     /*
  113.      * Information used to manage and display selection:
  114.      */
  115.  
  116.     Tk_3DBorder selBorder;    /* Border and background for selected
  117.                  * characters. */
  118.     int selBorderWidth;        /* Width of border around selection. */
  119.     XColor *selFgColorPtr;    /* Foreground color for selected text. */
  120.     Tk_Item *selItemPtr;    /* Pointer to selected item.  NULL means
  121.                  * selection isn't in this canvas. */
  122.     int selectFirst;        /* Index of first selected character. */
  123.     int selectLast;        /* Index of last selected character. */
  124.     Tk_Item *anchorItemPtr;    /* Item corresponding to "selectAnchor":
  125.                  * not necessarily selItemPtr. */
  126.     int selectAnchor;        /* Fixed end of selection (i.e. "select to"
  127.                  * operation will use this as one end of the
  128.                  * selection). */
  129.  
  130.     /*
  131.      * Information for display insertion cursor in text:
  132.      */
  133.  
  134.     Tk_3DBorder cursorBorder;    /* Used to draw vertical bar for insertion
  135.                  * cursor. */
  136.     int cursorWidth;        /* Total width of insertion cursor. */
  137.     int cursorBorderWidth;    /* Width of 3-D border around insert cursor. */
  138.     int cursorOnTime;        /* Number of milliseconds cursor should spend
  139.                  * in "on" state for each blink. */
  140.     int cursorOffTime;        /* Number of milliseconds cursor should spend
  141.                  * in "off" state for each blink. */
  142.     Tk_TimerToken cursorBlinkHandler;
  143.                 /* Timer handler used to blink cursor on and
  144.                  * off. */
  145.     Tk_Item *focusItemPtr;    /* Item that currently has the input focus,
  146.                  * or NULL if no such item. */
  147.  
  148.     /*
  149.      * Transformation applied to canvas as a whole:  to compute screen
  150.      * coordinates (X,Y) from canvas coordinates (x,y), do the following:
  151.      *
  152.      * X = x - xOrigin;
  153.      * Y = y - yOrigin;
  154.      */
  155.  
  156.     int xOrigin, yOrigin;    /* Canvas coordinates corresponding to
  157.                  * upper-left corner of window, given in
  158.                  * canvas pixel units. */
  159.     int drawableXOrigin, drawableYOrigin;
  160.                 /* During redisplay, these fields give the
  161.                  * canvas coordinates corresponding to
  162.                  * the upper-left corner of the drawable
  163.                  * where items are actually being drawn
  164.                  * (typically a pixmap smaller than the
  165.                  * whole window). */
  166.  
  167.     /*
  168.      * Information used for event bindings associated with items.
  169.      */
  170.  
  171.     Tk_BindingTable bindingTable;
  172.                 /* Table of all bindings currently defined
  173.                  * for this canvas.  NULL means that no
  174.                  * bindings exist, so the table hasn't been
  175.                  * created.  Each "object" used for this
  176.                  * table is either a Tk_Uid for a tag or
  177.                  * the address of an item named by id. */
  178.     Tk_Item *currentItemPtr;    /* The item currently containing the mouse
  179.                  * pointer, or NULL if none. */
  180.     double closeEnough;        /* The mouse is assumed to be inside an
  181.                  * item if it is this close to it. */
  182.     XEvent pickEvent;        /* The event upon which the current choice
  183.                  * of currentItem is based.  Must be saved
  184.                  * so that if the currentItem is deleted,
  185.                  * can pick another. */
  186.  
  187.     /*
  188.      * Information used for managing scrollbars:
  189.      */
  190.  
  191.     char *xScrollCmd;        /* Command prefix for communicating with
  192.                  * horizontal scrollbar.  NULL means no
  193.                  * horizontal scrollbar.  Malloc'ed*/
  194.     char *yScrollCmd;        /* Command prefix for communicating with
  195.                  * vertical scrollbar.  NULL means no
  196.                  * vertical scrollbar.  Malloc'ed*/
  197.     int scrollX1, scrollY1, scrollX2, scrollY2;
  198.                 /* These four coordinates define the region
  199.                  * that is the 100% area for scrolling (i.e.
  200.                  * these numbers determine the size and
  201.                  * location of the sliders on scrollbars).
  202.                  * Units are pixels in canvas coords. */
  203.     char *regionString;        /* The option string from which scrollX1
  204.                  * etc. are derived.  Malloc'ed. */
  205.     int scrollIncrement;    /* The number of canvas units that the
  206.                  * picture shifts when a scrollbar up or
  207.                  * down arrow is pressed. */
  208.  
  209.     /*
  210.      * Information used for scanning:
  211.      */
  212.  
  213.     int scanX;            /* X-position at which scan started (e.g.
  214.                  * button was pressed here). */
  215.     int scanXOrigin;        /* Value of xOrigin field when scan started. */
  216.     int scanY;            /* Y-position at which scan started (e.g.
  217.                  * button was pressed here). */
  218.     int scanYOrigin;        /* Value of yOrigin field when scan started. */
  219.  
  220.     /*
  221.      * Information used to speed up searches by remembering the last item
  222.      * created or found with an item id search.
  223.      */
  224.  
  225.     Tk_Item *hotPtr;        /* Pointer to "hot" item (one that's been
  226.                  * recently used.  NULL means there's no
  227.                  * hot item. */
  228.     Tk_Item *hotPrevPtr;    /* Pointer to predecessor to hotPtr (NULL
  229.                  * means item is first in list).  This is
  230.                  * only a hint and may not really be hotPtr's
  231.                  * predecessor. */
  232.  
  233.     /*
  234.      * Miscellaneous information:
  235.      */
  236.  
  237.     Cursor cursor;        /* Current cursor for window, or None. */
  238.     double pixelsPerMM;        /* Scale factor between MM and pixels;
  239.                  * used when converting coordinates. */
  240.     int flags;            /* Various flags;  see below for
  241.                  * definitions. */
  242.     int nextId;            /* Number to use as id for next item
  243.                  * created in widget. */
  244. } Tk_Canvas;
  245.  
  246. /*
  247.  * Flag bits for canvases:
  248.  *
  249.  * REDRAW_PENDING -        1 means a DoWhenIdle handler has already
  250.  *                been created to redraw some or all of the
  251.  *                canvas.
  252.  * REPICK_NEEDED -        1 means DisplayCanvas should pick a new
  253.  *                current item before redrawing the canvas.
  254.  * GOT_FOCUS -            1 means the focus is currently in this
  255.  *                widget, so should draw the insertion cursor.
  256.  * CURSOR_ON -            1 means the insertion cursor is in the "on"
  257.  *                phase of its blink cycle.  0 means either
  258.  *                we don't have the focus or the cursor is in
  259.  *                the "off" phase of its cycle.
  260.  * BUTTON_DOWN -        1 means that a button is currently down;
  261.  *                this is used to implement grabs for the
  262.  *                duration of button presses.
  263.  * UPDATE_SCROLLBARS -        1 means the scrollbars should get updated
  264.  *                as part of the next display operation.
  265.  */
  266.  
  267. #define REDRAW_PENDING        1
  268. #define REPICK_NEEDED        2
  269. #define GOT_FOCUS        4
  270. #define CURSOR_ON        8
  271. #define BUTTON_DOWN        0x10
  272. #define UPDATE_SCROLLBARS    0x20
  273.  
  274. /*
  275.  * Records of the following type are used to describe a type of
  276.  * item (e.g.  lines, circles, etc.) that can form part of a
  277.  * canvas widget.
  278.  */
  279.  
  280. typedef int    Tk_ItemCreateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  281.             Tk_Item *itemPtr, int argc, char **argv));
  282. typedef int    Tk_ItemConfigureProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  283.             Tk_Item *itemPtr, int argc, char **argv, int flags));
  284. typedef int    Tk_ItemCoordProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  285.             Tk_Item *itemPtr, int argc, char **argv));
  286. typedef void    Tk_ItemDeleteProc _ANSI_ARGS_((Tk_Item *itemPtr));
  287. typedef void    Tk_ItemDisplayProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  288.             Tk_Item *itemPtr, Drawable dst));
  289. typedef double    Tk_ItemPointProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  290.             Tk_Item *itemPtr, double *pointPtr));
  291. typedef int    Tk_ItemAreaProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  292.             Tk_Item *itemPtr, double *rectPtr));
  293. typedef void    Tk_ItemPostscriptProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  294.             Tk_Item *itemPtr));
  295. typedef void    Tk_ItemScaleProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  296.             Tk_Item *itemPtr, double originX, double originY,
  297.             double scaleX, double scaleY));
  298. typedef void    Tk_ItemTranslateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  299.             Tk_Item *itemPtr, double deltaX, double deltaY));
  300. typedef int    Tk_ItemIndexProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  301.             Tk_Item *itemPtr, char *indexString,
  302.             int *indexPtr));
  303. typedef void    Tk_ItemCursorProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  304.             Tk_Item *itemPtr, int index));
  305. typedef int    Tk_ItemSelectionProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  306.             Tk_Item *itemPtr, int offset, char *buffer,
  307.             int maxBytes));
  308. typedef int    Tk_ItemInsertProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  309.             Tk_Item *itemPtr, int beforeThis, char *string));
  310. typedef int    Tk_ItemDCharsProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  311.             Tk_Item *itemPtr, int first, int last));
  312.  
  313. typedef struct Tk_ItemType {
  314.     char *name;                /* The name of this type of item, such
  315.                      * as "line". */
  316.     int itemSize;            /* Total amount of space needed for
  317.                      * item's record. */
  318.     Tk_ItemCreateProc *createProc;    /* Procedure to create a new item of
  319.                      * this type. */
  320.     Tk_ConfigSpec *configSpecs;        /* Pointer to array of configuration
  321.                      * specs for this type.  Used for
  322.                      * returning configuration info. */
  323.     Tk_ItemConfigureProc *configProc;    /* Procedure to call to change
  324.                      * configuration options. */
  325.     Tk_ItemCoordProc *coordProc;    /* Procedure to call to get and set
  326.                      * the item's coordinates. */
  327.     Tk_ItemDeleteProc *deleteProc;    /* Procedure to delete existing item of
  328.                      * this type. */
  329.     Tk_ItemDisplayProc *displayProc;    /* Procedure to display items of
  330.                      * this type. */
  331.     int alwaysRedraw;            /* Non-zero means displayProc should
  332.                      * be called even when the item has
  333.                      * been moved off-screen. */
  334.     Tk_ItemPointProc *pointProc;    /* Computes distance from item to
  335.                      * a given point. */
  336.     Tk_ItemAreaProc *areaProc;        /* Computes whether item is inside,
  337.                      * outside, or overlapping an area. */
  338.     Tk_ItemPostscriptProc *postscriptProc;
  339.                     /* Procedure to write a Postscript
  340.                      * description for items of this
  341.                      * type. */
  342.     Tk_ItemScaleProc *scaleProc;    /* Procedure to rescale items of
  343.                      * this type. */
  344.     Tk_ItemTranslateProc *translateProc;/* Procedure to translate items of
  345.                      * this type. */
  346.     Tk_ItemIndexProc *indexProc;    /* Procedure to determine index of
  347.                      * indicated character.  NULL if
  348.                      * item doesn't support indexing. */
  349.     Tk_ItemCursorProc *cursorProc;    /* Procedure to set cursor position
  350.                      * to just before a given position. */
  351.     Tk_ItemSelectionProc *selectionProc;/* Procedure to return selection (in
  352.                      * STRING format) when it is in this
  353.                      * item. */
  354.     Tk_ItemInsertProc *insertProc;    /* Procedure to insert something into
  355.                      * an item. */
  356.     Tk_ItemDCharsProc *dCharsProc;    /* Procedure to delete characters
  357.                      * from an item. */
  358.     struct Tk_ItemType *nextPtr;    /* Used to link types together into
  359.                      * a list. */
  360. } Tk_ItemType;
  361.  
  362. /*
  363.  * Macros to transform a point from double-precision canvas coordinates
  364.  * to integer pixel coordinates in the pixmap where redisplay is being
  365.  * done.
  366.  */
  367.  
  368. #define SCREEN_X(canvasPtr, x) \
  369.     (((int) ((x) + 0.5)) - (canvasPtr)->drawableXOrigin)
  370. #define SCREEN_Y(canvasPtr, y) \
  371.     (((int) ((y) + 0.5)) - (canvasPtr)->drawableYOrigin)
  372.  
  373. /*
  374.  * Canvas-related variables that are shared among Tk modules but not
  375.  * exported to the outside world:
  376.  */
  377.  
  378. extern Tk_CustomOption tkCanvasTagsOption;
  379.  
  380. /*
  381.  * Canvas-related procedures that are shared among Tk modules but not
  382.  * exported to the outside world:
  383.  */
  384.  
  385. extern void        TkBezierScreenPoints _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  386.                 double control[], int numSteps,
  387.                 XPoint *xPointPtr));
  388. extern void        TkFillPolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  389.                 double *coordPtr, int numPoints, Drawable drawable,
  390.                 GC gc));
  391. extern int        TkGetCanvasCoord _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  392.                 char *string, double *doublePtr));
  393. extern void        TkIncludePoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  394.                 Tk_Item *itemPtr, double *pointPtr));
  395. extern int        TkMakeBezierCurve _ANSI_ARGS_((Tk_Canvas *canvasPtr,
  396.                 double *pointPtr, int numPoints, int numSteps,
  397.                 XPoint xPoints[], double dblPoints[]));
  398.  
  399. #endif /* _TKCANVAS */
  400.